一開始寫題目,用if...else來判別驗證使用者輸入,例如判別使用者輸入為整數,但如果要判別的很多樣(不能負數、不能浮點數等),就會巢狀下去...很可怕XD
看到別人使用try...catch覺得好棒,程式碼簡潔很多,於是來研究一下~
try...catch
主要用來捕捉程式在運作時,可能發生的例外處理(exception)或錯誤。
一般當程式發生錯誤就會停止運作,但try...catch
可以捕捉到錯誤,並讓程式繼續運作。
try {
//會執行的區塊
}catch(e){
//攔截錯誤的區塊
}finally{
//無論是否拋出錯誤都會執行的區塊
}
try
區塊執行,有錯誤或是例外處理(exception)就會跳到catch
區塊處理。try
可能產生的錯誤,利用catch
參數(e)取得錯誤信息。參數(e)只能使用在catch區塊內。finally
的區塊。try...catch
try...finally
try...catch...finally
try {
const num = 5;
if (typeof num !== "string") {
throw new Error("這不是字串"); // 拋出錯誤
}
console.log("wrong"); //這裡沒有執行到
} catch (e) {
console.log("到catch區塊了"); // "到catch區塊了"
console.log(e.message); // "這不是字串"
}
結果會先印出"到catch區塊了"
再來是"這不是字串"
。
檢查num
是否為字串,條件成立透過throw new Error
拋出我們自定義的錯誤,並將錯誤訊息"這不是字串"
傳給catch區塊。
try區塊在throw new Error("這不是字串")
就執行中斷,跳到catch
,所以後面的程式碼console.log("wrong")
就沒有執行了。
而到了catch區塊先印出"到catch區塊了"
,再來是把Error的message印出"這不是字串"
。
try {
throw new Error("有錯誤!");
} finally {
console.log("finally");
}
結果印出"finally"
即便拋出錯誤沒有catch
處理,瀏覽器會紅字報錯,finally
程式碼區塊仍會執行。
try {
const num = 5;
if (typeof num !== "string") {
throw new Error("這不是字串"); // 拋出錯誤
}
console.log("wrong"); //這裡沒有執行到
} catch (e) {
console.log("到catch區塊了"); // "到catch區塊了"
console.log(e.message); // "這不是字串"
} finally {
console.log("我是finally");
}
依照第一個try...catch做延伸,最後加上finally區塊,聰明的你/妳應該知道會印出什麼吧~
沒錯~最後的finally不管是否有拋出錯誤都會執行。
剛剛範例有throw new Error,簡單介紹一下它們:
使用throw拋出異常,可以指定要拋出的值:
throw expression;
例如:
throw "hello"; // 拋出字串
throw 55; // 拋出數值
throw false; // 拋出布林值
拋出的值沒有限定型別。
Error物件,有name
和message
屬性。name
:表示錯誤類型或名稱。如建立Error物件,name
預設為Error。
const error = new Error("有錯誤");
console.log(error.name); // "Error"
message
:用來傳達錯誤的內容,建立Error物件時,message
當作參數傳入。
const error = new Error("有錯誤");
console.log(error.message); // "有錯誤"
我們可以用console.dir
來查看error物件詳細內容:
console.dir(error);
就可以看到error這物件的屬性其中有message,當error.message
就可以取到資料。
以上分享~謝謝
MDN - try...catch
MDN - Error
MDN - Control flow and error handling
過度焦慮的 try-catch
Day4 前端蛇行撞牆記 - 讓你理解的 try...catch